Python渗透

text::Python


一、渗透流程imgimgimg


二、Python基础补充

1 命令行操作

1.1 sys

sys.argv:[0]是本身,[1]是第一个参数,等等。列表存储。

1.2 getopt

自定义带参输入。

# 第二个参数是单字符识别,不用隔开空格
opts,args = getopt.getopt( sys.argv[1:] , "u:p:" , ["file="])
#opts:列表,值为元组,存 ( 选项,选项值 )
#上述选项有:-u -p --file(u: 后面必须有选项值,u 后面没有选项值,带 = 同理后面一定要有参数,否则没有)
#所有选项需要写在参数前面,否则后面的选项会被当做参数传递到 args 中。

1.3 optparse

自动生成帮助文档。

帮助

# 添加总文档
parser = optparse.OptionParser(usage)
# 添加单个参数
parser.add_option('-u','--user',dest='User',type='string',help='target user',default='root')
# dest 是 key,type检测参数格式是否正确,help是帮助信息,default是默认值

#解包,带选项以字典存入options中,不带的存入args中
options,args = parser.parse_args()

# 案例
import optparse

usage = "python %prog -u/--user -p/--password " # %prog:file_name
parser = optparse.OptionParser(usage)
parser.add_option('-u','--user',dest='User',type='string',help='target user',default='root')
parser.add_option('-p','--password',dest='Pad',type='string',help='target password')
options,args = parser.parse_args()

print("options:",options)
print("user:",options.User)
print("password:",options.Pad)
print("args",args)

1.4 argparse

同理 optparse 但比 optparse 更简单快捷。

帮助

# choices 是选择范围,nargs是参数个数,required是是否必须
# 案例
import argparse

parser = argparse.ArgumentParser()
parser.add_argument('-u','--user',dest='User',type=str,default='root',help='target User')
parser.add_argument('-s','--sex',dest='Sex',type=str,choices={'男','女'},default='男',help='target Sex')
parser.add_argument('-n','--number',dest='Num',nargs=2,required=True,type=int,help='Target Two Numbers')
arg = parser.parse_args()

# arg.<name>:获得单个参数值

2 网络编程

socket与socketserver

2.1 IP地址查询

GeoLiteCity.Dat

ip查询:【1】 【2】 【3】 【4】

# 调用程序查询
import pygeoip
geo = pygeoip.GeoIP( 'GeoLiteCity\GeoLiteCity.dat' )
geo.record_by_name( 'ip' )

2.2 基础函数

from socket import *

# 创建套接字
s = socket( AF_INET , SOCK , IPPROTO )
# tup是元组:( ip:int , port:str ),TCP/UDP 服务器都绑定
s.bind(tup)
s.connect(tup)
# backlog是排队数,backlog+1 表示允许的最大连接数
s.listen(backlog)
# conn是用于通信的套接字
conn , addr = s.accept()

s.send(buf, [,flags])
s.recv(buflen, [,flags])
s.sendto(str, addr)
data,addr = s.recvfrom(buflen, [,flags])

# 发送全部
s.sendall(buf)
# 发送的数据要编码和解码
buf.encode() / decode()

2.3 其他函数

# 获取本地 mac 地址
import uuid
def get_Mac_Address():
mac = uuid.UUID(int = uuid.getnode()).hex[-12:]
return ":".join([mac[e:e+2] for e in range(0,11,2)])

# 获取 ip port
# 通过主机名获得 ip
ip = gethostbyname(gethostname())
# 通过 ip 获得 hostname(返回一个元组)
gethostbyaddr(ip)
# 通过 port 获得 服务名
getservbyport(3389,"tcp")
# 通过 服务名 获得 port
getservbyname("http")

2.4 文件传输实例

my::案例

结构体

服务器

提示界面(cmd)——创建线程类(类中实现发送文件,不需要再 listen 等操作)——发送数据

# 创建线程
socketserver.ThreadingTCPServer(addr,MyServer)

# 创建类
class MyServer(socketserver.BaseRequestHandler):
def handle(self): # 重写该类功能
self.request # 为 socket
self.request.close() # 关闭套接字

# 打包(i:int类型,dir:字典)
struct.pack('i',int).encode('utf-8')
json.dumps(dir)

客户端

提示界面(cmd)——connect——接收数据

# 解包
struct.unpack('i',int)
json.loads(info.decode('utf-8'))

2.5 可执行文件转化

pyinstaller打包只可再编译同一操作系统下运行。(不同易报错)

3 setting


三、Pocsuite3

1 安装

Pocsuite3安装:

  1. pip install pocsuite
  2. git clone https://github.com/knownsec/pocsuite3.git
  3. wget https://github.com/knownsec/pocsuite3/archive/master.zip

必要库安装(在pocsuite3库下使用):

  1. cd /usr/lib/python3/dist-packages/pocsuite3
  2. pip3 install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple/

使用:

  1. 在pocsuite3路径下,python3 cli.py <-para>

2 cli.py使用

Shodan的Key验证:https://api.shodan.io/account/profile?key=xxx

Fofa的key验证:https://fofa.info/api/v1/info/my?email=xxx&key=xxx

命令 作用
-u URL [URL…] , —url URL [URL…] 直接指定URL,可以指定多个
-f URL_FILE , —file URL_FILE 加载指定文件中的目标
-r POC [POC…] 加载POC脚本
-c CONFIGFILE Load options from a configuration INI file 调用配置文件。通过配置文件中的配置信息对目标进行POC验证
—verify 验证目标
—attack 攻击目标
—shell 交互模式
—command [command] 执行命令
# 验证
python3 cli.py -r pocs/poc-flask.py -u http://ip -- verify

# 带命令攻击
python3 cli.py -r pocs/all-flask.py -f /root/url.txt --attack --command id

# 进行交互模式
python3 cli.py -r pocs/all-flask.py -f /root/url.txt --shell

# 加载配置文件(token在ini中,报错可能是网速原因)
python3 cli.py -c ../pocsuite.ini


# 调用搜索引擎接口
# Zoomeye
python3 cli.py -r pocs/redis_unauthorized_access.py --dork "product:redis"
# Shodan
python3 cli.py -r pocs/redis_unauthorized_access.py --dork-shodan "product:redis" --shodan-token "xxx"
# fofa
python3 cli.py -r pocs/redis_unauthorized_access.py --dork-fofa "service:redis" --fofa-user "xxx" --fofa-token "xxx"

3 console.py使用

# 进入交互命令模式
python3 console.py

# 帮助
help

# 列举脚本
list

# 使用poc脚本
use [path]
use pocs/poc-flask

# 查看要填的参数(类似msf,"require"的参数必填)
show options

# 设置参数
set [Name] [value]
set target http://ip

# 运行
run

# 反弹shell
exploit

4 Flask模板注入漏洞

Jinja2

# 漏洞环境
from flask import Flask, request
from jinja2 import Template

app = Flask(__name__)
@app.route("/")
def index():
name = request.args.get('name', 'guest')
t = Template("Hello" + name)
return t.render()

if __name__ == "__main__":
app.run()

# 验证漏洞(返回Hello 4表示漏洞存在)
http://127.0.0.1:5000?name={{2*2}}